/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import control.FichaMascara;
import control.Skill;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 *
 * @author yurifw
 */
public class ManterXML {

    public void salvarFicha(FichaMascara ficha, String caminho) {

        try {
            //criando a base do xml
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.newDocument();
            //começando a escrever o xml
            Element fichaXML = doc.createElement("ficha");
            doc.appendChild(fichaXML);
            Element cabecalho = doc.createElement("cabecalho");
            fichaXML.appendChild(cabecalho);
            //preenchendo o XML dentro do campo cabecalho
            Element nome = doc.createElement("nome");
            cabecalho.appendChild(nome);
            nome.appendChild(doc.createTextNode(ficha.getNome()));

            Element jogador = doc.createElement("jogador");
            cabecalho.appendChild(jogador);
            jogador.appendChild(doc.createTextNode(ficha.getJogador()));

            Element cronica = doc.createElement("cronica");
            cabecalho.appendChild(cronica);
            cronica.appendChild(doc.createTextNode(ficha.getCronica()));

            Element natureza = doc.createElement("natureza");
            cabecalho.appendChild(natureza);
            natureza.appendChild(doc.createTextNode(ficha.getNatureza()));

            Element comportamento = doc.createElement("comportamento");
            cabecalho.appendChild(comportamento);
            comportamento.appendChild(doc.createTextNode(ficha.getComportamento()));

            Element cla = doc.createElement("cla");
            cabecalho.appendChild(cla);
            cla.appendChild(doc.createTextNode(ficha.getCla()));

            Element geracao = doc.createElement("geracao");
            cabecalho.appendChild(geracao);
            geracao.appendChild(doc.createTextNode(ficha.getGeracao() + ""));

            Element refugio = doc.createElement("refugio");
            cabecalho.appendChild(refugio);
            refugio.appendChild(doc.createTextNode(ficha.getRefugio()));

            Element conceito = doc.createElement("conceito");
            cabecalho.appendChild(conceito);
            conceito.appendChild(doc.createTextNode(ficha.getConceito()));

            //fechando a tag <cabecalho>(automaticamente) e criando a tag <atributos>
            Element atributos = doc.createElement("atributos");
            fichaXML.appendChild(atributos);
            Element fisicos = doc.createElement("fisicos");
            atributos.appendChild(fisicos);
            Element forca = doc.createElement("forca");
            fisicos.appendChild(forca);
            forca.appendChild(doc.createTextNode(ficha.getForca() + ""));

            Attr especForca = doc.createAttribute("especialidade");
            forca.setAttributeNode(especForca);
            especForca.appendChild(doc.createTextNode(ficha.getEspecForca()));


            Element destreza = doc.createElement("destreza");
            fisicos.appendChild(destreza);
            destreza.appendChild(doc.createTextNode(ficha.getDestreza() + ""));
            Attr especDestreza = doc.createAttribute("especialidade");
            destreza.setAttributeNode(especDestreza);
            especDestreza.appendChild(doc.createTextNode(ficha.getEspecDestreza()));


            Element vigor = doc.createElement("vigor");
            fisicos.appendChild(vigor);
            vigor.appendChild(doc.createTextNode(ficha.getVigor() + ""));
            Attr especVigor = doc.createAttribute("especialidade");
            vigor.setAttributeNode(especVigor);
            especVigor.appendChild(doc.createTextNode(ficha.getEspecVigor()));


            Element sociais = doc.createElement("sociais");
            atributos.appendChild(sociais);

            Element carisma = doc.createElement("carisma");
            sociais.appendChild(carisma);
            carisma.appendChild(doc.createTextNode(ficha.getCarisma() + ""));
            Attr especCarisma = doc.createAttribute("especialidade");
            carisma.setAttributeNode(especCarisma);
            especCarisma.appendChild(doc.createTextNode(ficha.getEspecCarisma()));


            Element manipulacao = doc.createElement("manipulacao");
            sociais.appendChild(manipulacao);
            manipulacao.appendChild(doc.createTextNode(ficha.getManipulacao() + ""));
            Attr especManipulacao = doc.createAttribute("especialidade");
            manipulacao.setAttributeNode(especManipulacao);
            especManipulacao.appendChild(doc.createTextNode(ficha.getEspecManipulacao()));

            Element aparencia = doc.createElement("aparencia");
            sociais.appendChild(aparencia);
            aparencia.appendChild(doc.createTextNode(ficha.getAparencia() + ""));
            Attr especAparencia = doc.createAttribute("especialidade");
            aparencia.setAttributeNode(especAparencia);
            especAparencia.appendChild(doc.createTextNode(ficha.getEspecAparencia()));

            Element mentais = doc.createElement("mentais");
            atributos.appendChild(mentais);

            Element percepcao = doc.createElement("percepcao");
            mentais.appendChild(percepcao);
            percepcao.appendChild(doc.createTextNode(ficha.getPercepcao() + ""));
            Attr especPercepcao = doc.createAttribute("especialidade");
            percepcao.setAttributeNode(especPercepcao);
            especPercepcao.appendChild(doc.createTextNode(ficha.getEspecPercepcao()));

            Element inteligencia = doc.createElement("inteligencia");
            mentais.appendChild(inteligencia);
            inteligencia.appendChild(doc.createTextNode(ficha.getInteligencia() + ""));
            Attr especInteligencia = doc.createAttribute("especialidade");
            inteligencia.setAttributeNode(especInteligencia);
            especInteligencia.appendChild(doc.createTextNode(ficha.getEspecInteligencia()));

            Element raciocinio = doc.createElement("raciocinio");
            mentais.appendChild(raciocinio);
            raciocinio.appendChild(doc.createTextNode(ficha.getRaciocinio() + ""));
            Attr especRaciocinio = doc.createAttribute("especialidade");
            raciocinio.setAttributeNode(especRaciocinio);
            especRaciocinio.appendChild(doc.createTextNode(ficha.getEspecRaciocinio()));

            Element habilidades = doc.createElement("habilidades");
            fichaXML.appendChild(habilidades);
            Element talentos = doc.createElement("talentos");
            habilidades.appendChild(talentos);

            Element prontidao = doc.createElement("prontidao");
            talentos.appendChild(prontidao);
            prontidao.appendChild(doc.createTextNode(ficha.getProntidao() + ""));
            Attr especProntidao = doc.createAttribute("especialidade");
            prontidao.setAttributeNode(especProntidao);
            especProntidao.appendChild(doc.createTextNode(ficha.getEspecProntidao()));

            Element esportes = doc.createElement("esportes");
            talentos.appendChild(esportes);
            esportes.appendChild(doc.createTextNode(ficha.getEsportes() + ""));
            Attr especEsportes = doc.createAttribute("especialidade");
            esportes.setAttributeNode(especEsportes);
            especEsportes.appendChild(doc.createTextNode(ficha.getEspecEsportes()));

            Element briga = doc.createElement("briga");
            talentos.appendChild(briga);
            briga.appendChild(doc.createTextNode(ficha.getBriga() + ""));
            Attr especBriga = doc.createAttribute("especialidade");
            briga.setAttributeNode(especBriga);
            especBriga.appendChild(doc.createTextNode(ficha.getEspecBriga()));


            Element esquiva = doc.createElement("esquiva");
            talentos.appendChild(esquiva);
            esquiva.appendChild(doc.createTextNode(ficha.getEsquiva() + ""));
            Attr especEsquiva = doc.createAttribute("especialidade");
            esquiva.setAttributeNode(especEsquiva);
            especEsquiva.appendChild(doc.createTextNode(ficha.getEspecEsquiva()));

            Element empatia = doc.createElement("empatia");
            talentos.appendChild(empatia);
            empatia.appendChild(doc.createTextNode(ficha.getEmpatia() + ""));
            Attr especEmpatia = doc.createAttribute("especialidade");
            empatia.setAttributeNode(especEmpatia);
            especEmpatia.appendChild(doc.createTextNode(ficha.getEspecEmpatia()));

            Element expressao = doc.createElement("expressao");
            talentos.appendChild(expressao);
            expressao.appendChild(doc.createTextNode(ficha.getExpressao() + ""));
            Attr especExpressao = doc.createAttribute("especialidade");
            expressao.setAttributeNode(especExpressao);
            especExpressao.appendChild(doc.createTextNode(ficha.getEspecExpressao()));

            Element intimidacao = doc.createElement("intimidacao");
            talentos.appendChild(intimidacao);
            intimidacao.appendChild(doc.createTextNode(ficha.getIntimidacao() + ""));
            Attr especIntimidacao = doc.createAttribute("especialidade");
            intimidacao.setAttributeNode(especIntimidacao);
            especIntimidacao.appendChild(doc.createTextNode(ficha.getEspecIntimidacao()));

            Element lideranca = doc.createElement("lideranca");
            talentos.appendChild(lideranca);
            lideranca.appendChild(doc.createTextNode(ficha.getLideranca() + ""));
            Attr especLideranca = doc.createAttribute("especialidade");
            lideranca.setAttributeNode(especLideranca);
            especLideranca.appendChild(doc.createTextNode(ficha.getEspecLideranca()));

            Element manha = doc.createElement("manha");
            talentos.appendChild(manha);
            manha.appendChild(doc.createTextNode(ficha.getManha() + ""));
            Attr especManha = doc.createAttribute("especialidade");
            manha.setAttributeNode(especManha);
            especManha.appendChild(doc.createTextNode(ficha.getEspecManha()));

            Element labia = doc.createElement("labia");
            talentos.appendChild(labia);
            labia.appendChild(doc.createTextNode(ficha.getLabia() + ""));
            Attr especLabia = doc.createAttribute("especialidade");
            labia.setAttributeNode(especLabia);
            especLabia.appendChild(doc.createTextNode(ficha.getEspecLabia()));

            Element pericias = doc.createElement("pericias");
            habilidades.appendChild(pericias);

            Element empatiaAnimais = doc.createElement("empatiaAnimais");
            pericias.appendChild(empatiaAnimais);
            empatiaAnimais.appendChild(doc.createTextNode(ficha.getEmpatiaAnimais() + ""));
            Attr especEmpatiaAnimais = doc.createAttribute("especialidade");
            empatiaAnimais.setAttributeNode(especEmpatiaAnimais);
            especEmpatiaAnimais.appendChild(doc.createTextNode(ficha.getEspecEmpatiaAnimais()));

            Element oficios = doc.createElement("oficios");
            pericias.appendChild(oficios);
            oficios.appendChild(doc.createTextNode(ficha.getOficios() + ""));
            Attr especOficios = doc.createAttribute("especialidade");
            oficios.setAttributeNode(especOficios);
            especOficios.appendChild(doc.createTextNode(ficha.getEspecOficios()));

            Element conducao = doc.createElement("conducao");
            pericias.appendChild(conducao);
            conducao.appendChild(doc.createTextNode(ficha.getConducao() + ""));
            Attr especConducao = doc.createAttribute("especialidade");
            conducao.setAttributeNode(especConducao);
            especConducao.appendChild(doc.createTextNode(ficha.getEspecConducao()));

            Element etiqueta = doc.createElement("etiqueta");
            pericias.appendChild(etiqueta);
            etiqueta.appendChild(doc.createTextNode(ficha.getEtiqueta() + ""));
            Attr especEtiqueta = doc.createAttribute("especialidade");
            etiqueta.setAttributeNode(especEtiqueta);
            especEtiqueta.appendChild(doc.createTextNode(ficha.getEspecEtiqueta()));

            Element armasFogo = doc.createElement("armasFogo");
            pericias.appendChild(armasFogo);
            armasFogo.appendChild(doc.createTextNode(ficha.getArmasFogo() + ""));
            Attr especArmasFogo = doc.createAttribute("especialidade");
            armasFogo.setAttributeNode(especArmasFogo);
            especArmasFogo.appendChild(doc.createTextNode(ficha.getEspecArmasFogo()));

            Element armasBrancas = doc.createElement("armasBrancas");
            pericias.appendChild(armasBrancas);
            armasBrancas.appendChild(doc.createTextNode(ficha.getArmasBrancas() + ""));
            Attr especArmasBrancas = doc.createAttribute("especialidade");
            armasBrancas.setAttributeNode(especArmasBrancas);
            especArmasBrancas.appendChild(doc.createTextNode(ficha.getEspecArmasBrancas()));

            Element performance = doc.createElement("performance");
            pericias.appendChild(performance);
            performance.appendChild(doc.createTextNode(ficha.getPerformance() + ""));
            Attr especPerformance = doc.createAttribute("especialidade");
            performance.setAttributeNode(especPerformance);
            especPerformance.appendChild(doc.createTextNode(ficha.getEspecPerformance()));

            Element seguranca = doc.createElement("seguranca");
            pericias.appendChild(seguranca);
            seguranca.appendChild(doc.createTextNode(ficha.getSegurnaca() + ""));
            Attr especSeguranca = doc.createAttribute("especialidade");
            seguranca.setAttributeNode(especSeguranca);
            especSeguranca.appendChild(doc.createTextNode(ficha.getEspecSeguranca()));

            Element furtividade = doc.createElement("furtividade");
            pericias.appendChild(furtividade);
            furtividade.appendChild(doc.createTextNode(ficha.getFurtividade() + ""));
            Attr especFurtividade = doc.createAttribute("especialidade");
            furtividade.setAttributeNode(especFurtividade);
            especFurtividade.appendChild(doc.createTextNode(ficha.getEspecFurtividade()));

            Element sobrevivencia = doc.createElement("sobrevivencia");
            pericias.appendChild(sobrevivencia);
            sobrevivencia.appendChild(doc.createTextNode(ficha.getSobrevivencia() + ""));
            Attr especSobrevivencia = doc.createAttribute("especialidade");
            sobrevivencia.setAttributeNode(especSobrevivencia);
            especSobrevivencia.appendChild(doc.createTextNode(ficha.getEspecSobrevivencia()));

            Element conhecimentos = doc.createElement("conhecimentos");
            habilidades.appendChild(conhecimentos);

            Element academicos = doc.createElement("academicos");
            conhecimentos.appendChild(academicos);
            academicos.appendChild(doc.createTextNode(ficha.getAcademico() + ""));
            Attr especAcademicos = doc.createAttribute("especialidade");
            academicos.setAttributeNode(especAcademicos);
            especAcademicos.appendChild(doc.createTextNode(ficha.getEspecAcademico()));

            Element computador = doc.createElement("computador");
            conhecimentos.appendChild(computador);
            computador.appendChild(doc.createTextNode(ficha.getComputador() + ""));
            Attr especComputador = doc.createAttribute("especialidade");
            computador.setAttributeNode(especComputador);
            especComputador.appendChild(doc.createTextNode(ficha.getEspecComputador()));

            Element financas = doc.createElement("financas");
            conhecimentos.appendChild(financas);
            financas.appendChild(doc.createTextNode(ficha.getFinancas() + ""));
            Attr especFinancas = doc.createAttribute("especialidade");
            financas.setAttributeNode(especFinancas);
            especFinancas.appendChild(doc.createTextNode(ficha.getEspecFinancas()));

            Element investigacao = doc.createElement("investigacao");
            conhecimentos.appendChild(investigacao);
            investigacao.appendChild(doc.createTextNode(ficha.getInvestigacao() + ""));
            Attr especInvestigacao = doc.createAttribute("especialidade");
            investigacao.setAttributeNode(especInvestigacao);
            especInvestigacao.appendChild(doc.createTextNode(ficha.getEspecInvestigacao()));

            Element direito = doc.createElement("direito");
            conhecimentos.appendChild(direito);
            direito.appendChild(doc.createTextNode(ficha.getDireito() + ""));
            Attr especDireito = doc.createAttribute("especialidade");
            direito.setAttributeNode(especDireito);
            especDireito.appendChild(doc.createTextNode(ficha.getEspecDireito()));

            Element linguistica = doc.createElement("linguistica");
            conhecimentos.appendChild(linguistica);
            linguistica.appendChild(doc.createTextNode(ficha.getLinguistica() + ""));
            Attr especLinguistica = doc.createAttribute("especialidade");
            linguistica.setAttributeNode(especLinguistica);
            especLinguistica.appendChild(doc.createTextNode(ficha.getEspecLinguistica()));

            Element medicina = doc.createElement("medicina");
            conhecimentos.appendChild(medicina);
            medicina.appendChild(doc.createTextNode(ficha.getMedicina() + ""));
            Attr especMedicina = doc.createAttribute("especialidade");
            medicina.setAttributeNode(especMedicina);
            especMedicina.appendChild(doc.createTextNode(ficha.getEspecMedicina()));

            Element ocultismo = doc.createElement("ocultismo");
            conhecimentos.appendChild(ocultismo);
            ocultismo.appendChild(doc.createTextNode(ficha.getOcultismo() + ""));
            Attr especOcultismo = doc.createAttribute("especialidade");
            ocultismo.setAttributeNode(especOcultismo);
            especOcultismo.appendChild(doc.createTextNode(ficha.getEspecOcultismo()));

            Element politica = doc.createElement("politica");
            conhecimentos.appendChild(politica);
            politica.appendChild(doc.createTextNode(ficha.getPolitica() + ""));
            Attr especPolitica = doc.createAttribute("especialidade");
            politica.setAttributeNode(especPolitica);
            especPolitica.appendChild(doc.createTextNode(ficha.getEspecPolitica()));

            Element ciencia = doc.createElement("ciencia");
            conhecimentos.appendChild(ciencia);
            ciencia.appendChild(doc.createTextNode(ficha.getCiencia() + ""));
            Attr especCiencia = doc.createAttribute("especialidade");
            ciencia.setAttributeNode(especCiencia);
            especCiencia.appendChild(doc.createTextNode(ficha.getEspecCiencia()));

            Element vantagens = doc.createElement("vantagens");
            fichaXML.appendChild(vantagens);
            Element antecedentes = doc.createElement("antecedentes");
            vantagens.appendChild(antecedentes);

            List<Skill> listaAntecdentes = new ArrayList<Skill>();
            listaAntecdentes = ficha.getAntecedentes();
            int i = 0;
            for (Skill q : listaAntecdentes) {
                i++;
                Element antecedente = doc.createElement("antecedente");
                antecedentes.appendChild(antecedente);
                Attr nomeAntecedente = doc.createAttribute("nome");
                nomeAntecedente.setValue(q.getNome());
                antecedente.setAttributeNode(nomeAntecedente);
                antecedente.appendChild(doc.createTextNode(q.getNivel() + ""));
            }

            Element disciplinas = doc.createElement("disciplinas");
            vantagens.appendChild(disciplinas);

            List<Skill> listaDisciplinas = new ArrayList<Skill>();
            listaDisciplinas = ficha.getDisciplinas();
            i = 0;
            for (Skill q : listaDisciplinas) {
                i++;
                Element disciplina = doc.createElement("disciplina");
                disciplinas.appendChild(disciplina);
                Attr nomeDisciplina = doc.createAttribute("nome");
                nomeDisciplina.setValue(q.getNome());
                disciplina.setAttributeNode(nomeDisciplina);
                disciplina.appendChild(doc.createTextNode(q.getNivel() + ""));
            }


            //TO DO: COLOCAR UM ATRIBUTO NOS CAMPOS DE CONSCIENCIA E AUTOCONTROLE
            // PRA SABER QUAL DOS DOIS FOI MARCADO

            Element virtudes = doc.createElement("virtudes");
            vantagens.appendChild(virtudes);
            Element conscienciaConviccao = doc.createElement("conscienciaConviccao");
            virtudes.appendChild(conscienciaConviccao);
            conscienciaConviccao.appendChild(doc.createTextNode(ficha.getConsciencia() + ""));

            Element autocontroleInstintos = doc.createElement("autocontroleInstintos");
            virtudes.appendChild(autocontroleInstintos);
            autocontroleInstintos.appendChild(doc.createTextNode(ficha.getAutocontrole() + ""));

            Element coragem = doc.createElement("coragem");
            virtudes.appendChild(coragem);
            coragem.appendChild(doc.createTextNode(ficha.getCoragem() + ""));

            Element qualidadesDefeitos = doc.createElement("qualidadesDefeitos");
            fichaXML.appendChild(qualidadesDefeitos);

            //TO DO ordenar a lista de qualidade e defeito de acordo com o ponto
            List<Skill> listaQualidadesDefeitos = new ArrayList<Skill>();
            listaQualidadesDefeitos = ficha.getQualidadesDefeitos();
            i = 0;
            for (Skill q : listaQualidadesDefeitos) {
                i++;
                Element qualidadeDefeito = doc.createElement("qualidadeDefeito");
                qualidadesDefeitos.appendChild(qualidadeDefeito);
                Attr nomeDisciplina = doc.createAttribute("nome");
                nomeDisciplina.setValue(q.getNome());
                qualidadeDefeito.setAttributeNode(nomeDisciplina);
                qualidadeDefeito.appendChild(doc.createTextNode(q.getNivel() + ""));
            }

            Element humanidade = doc.createElement("humanidade");
            fichaXML.appendChild(humanidade);
            Attr trilha = doc.createAttribute("trilha");
            trilha.setValue(ficha.getTrilha());
            humanidade.setAttributeNode(trilha);
            humanidade.appendChild(doc.createTextNode(ficha.getHumanidade() + ""));

            Element forcaVontade = doc.createElement("forcaVontade");
            fichaXML.appendChild(forcaVontade);
            forcaVontade.appendChild(doc.createTextNode(ficha.getForcaDeVontade() + ""));



            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result;
            result = new StreamResult(new File(caminho));

            transformer.transform(source, result);

            JOptionPane.showMessageDialog(null, "A Ficha foi salva com sucesso", "Sucesso", JOptionPane.INFORMATION_MESSAGE);






        } catch (ParserConfigurationException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        } catch (TransformerException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }

    public FichaMascara lerFicha(Document doc) {
        /*
         * o parametro doc é um documento XML, q deve ser intanciado assim:
         DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
         Document doc = docBuilder.parse("URI do arquivo aqui");
         *
         */


        FichaMascara ficha = new FichaMascara();

        Element raiz = doc.getDocumentElement(); // pega a tag raiz do documento

        //pega uma lista de elementos com o nome cabeçalho e joga pra variavel listaCabecalho
        NodeList listaCabecalho = raiz.getElementsByTagName("cabecalho");
        //joga a tag cabecalho com indice 0 para o elemento cabecalho
        Element cabecalho = (Element) listaCabecalho.item(0);

        //usa a variavel cabecalho e pegar a lista de tags com o nome "nome":
        NodeList listaNomes = cabecalho.getElementsByTagName("nome");
        //joga o item de indice 0 pra dentro da variavel Node nome, e usa getFirstChild() para retornar o texto da tag
        Node nome = listaNomes.item(0).getFirstChild();
        ficha.setNome(nome.getNodeValue());

        /* nos casos acima esta sendo usado o item(0) pq de acordo com a estrutura do documento XML
         * so existe uma tag cabecalho, ou uma tag nome...
         * se a lista que voce buscar tiver mais do que um item será necessario um loop
         */

        NodeList listaJogador = cabecalho.getElementsByTagName("jogador");
        Node jogador = listaJogador.item(0).getFirstChild();
        ficha.setJogador(jogador.getNodeValue());

        NodeList listaCronica = cabecalho.getElementsByTagName("cronica");
        Node cronica = listaCronica.item(0).getFirstChild();
        ficha.setCronica(cronica.getNodeValue());

        NodeList listaNatureza = cabecalho.getElementsByTagName("natureza");
        Node natureza = listaNatureza.item(0).getFirstChild();
        ficha.setNatureza(natureza.getNodeValue());

        NodeList listaComportamento = cabecalho.getElementsByTagName("comportamento");
        Node comportamento = listaComportamento.item(0).getFirstChild();
        ficha.setComportamento(comportamento.getNodeValue());

        NodeList listaCla = cabecalho.getElementsByTagName("cla");
        Node cla = listaCla.item(0).getFirstChild();
        ficha.setCla(cla.getNodeValue());

        NodeList listaGeracao = cabecalho.getElementsByTagName("geracao");
        Node geracao = listaGeracao.item(0).getFirstChild();
        ficha.setGeracao(Integer.parseInt(geracao.getNodeValue()));

        NodeList listaRefugio = cabecalho.getElementsByTagName("refugio");
        Node refugio = listaRefugio.item(0).getFirstChild();
        ficha.setRefugio(refugio.getNodeValue());

        NodeList listaConceito = cabecalho.getElementsByTagName("conceito");
        Node conceito = listaConceito.item(0).getFirstChild();
        ficha.setConceito(conceito.getNodeValue());

        NodeList listaTiposAtributo = raiz.getElementsByTagName("atributos");
        Element tiposAtributo = (Element) listaTiposAtributo.item(0);

        NodeList listaFisicos = tiposAtributo.getElementsByTagName("fisicos");
        Element fisicos = (Element) listaFisicos.item(0);

        NodeList listaForca = fisicos.getElementsByTagName("forca");
        Node forca = listaForca.item(0).getFirstChild();
        ficha.setForca(Integer.parseInt(forca.getNodeValue()));
        Element especForcaElement = (Element) listaForca.item(0);
        Attr especForca = especForcaElement.getAttributeNode("especialidade");
        ficha.setEspecForca(especForca.getNodeValue());
        /*
         NodeList listaHumanidade = raiz.getElementsByTagName("humanidade");
         Node humanidade = listaHumanidade.item(0).getFirstChild();
         ficha.setHumanidade(Integer.parseInt(humanidade.getNodeValue()));
         Element trilhaElement = (Element) listaHumanidade.item(0);
         Attr trilha = trilhaElement.getAttributeNode("trilha");
         ficha.setTrilha(trilha.getNodeValue());
         * 
         */

        NodeList listaDestreza = fisicos.getElementsByTagName("destreza");
        Node destreza = listaDestreza.item(0).getFirstChild();
        ficha.setDestreza(Integer.parseInt(destreza.getNodeValue()));
        Element especDestrezaElement = (Element) listaDestreza.item(0);
        Attr especDestreza = especDestrezaElement.getAttributeNode("especialidade");
        ficha.setEspecDestreza(especDestreza.getNodeValue());

        NodeList listaVigor = fisicos.getElementsByTagName("vigor");
        Node vigor = listaVigor.item(0).getFirstChild();
        ficha.setVigor(Integer.parseInt(vigor.getNodeValue()));
        Element especVigorElement = (Element) listaVigor.item(0);
        Attr especVigor = especVigorElement.getAttributeNode("especialidade");
        ficha.setEspecVigor(especVigor.getNodeValue());

        NodeList listaSociais = tiposAtributo.getElementsByTagName("sociais");
        Element sociais = (Element) listaSociais.item(0);

        NodeList listaCarisma = sociais.getElementsByTagName("carisma");
        Node carisma = listaCarisma.item(0).getFirstChild();
        ficha.setCarisma(Integer.parseInt(carisma.getNodeValue()));
        Element especCarismaElement = (Element) listaCarisma.item(0);
        Attr especCarisma = especCarismaElement.getAttributeNode("especialidade");
        ficha.setEspecCarisma(especCarisma.getNodeValue());

        NodeList listaAparencia = sociais.getElementsByTagName("aparencia");
        Node aparencia = listaAparencia.item(0).getFirstChild();
        ficha.setAparencia(Integer.parseInt(aparencia.getNodeValue()));
        Element especAparenciaElement = (Element) listaAparencia.item(0);
        Attr especAparencia = especAparenciaElement.getAttributeNode("especialidade");
        ficha.setEspecAparencia(especAparencia.getNodeValue());

        NodeList listaManipulacao = sociais.getElementsByTagName("manipulacao");
        Node manipulacao = listaManipulacao.item(0).getFirstChild();
        ficha.setManipulacao(Integer.parseInt(manipulacao.getNodeValue()));
        Element especManipulacaoElement = (Element) listaManipulacao.item(0);
        Attr especManipulacao = especManipulacaoElement.getAttributeNode("especialidade");
        ficha.setEspecManipulacao(especManipulacao.getNodeValue());

        NodeList listaMentais = tiposAtributo.getElementsByTagName("mentais");
        Element mentais = (Element) listaMentais.item(0);

        NodeList listaPercepcao = mentais.getElementsByTagName("percepcao");
        Node percepcao = listaPercepcao.item(0).getFirstChild();
        ficha.setPercepcao(Integer.parseInt(percepcao.getNodeValue()));
        Element especPercepcaoElement = (Element) listaPercepcao.item(0);
        Attr especPercepcao = especPercepcaoElement.getAttributeNode("especialidade");
        ficha.setEspecPercepcao(especPercepcao.getNodeValue());

        NodeList listaInteligencia = mentais.getElementsByTagName("inteligencia");
        Node inteligencia = listaInteligencia.item(0).getFirstChild();
        ficha.setInteligencia(Integer.parseInt(inteligencia.getNodeValue()));
        Element especInteligenciaElement = (Element) listaInteligencia.item(0);
        Attr especInteligencia = especInteligenciaElement.getAttributeNode("especialidade");
        ficha.setEspecInteligencia(especInteligencia.getNodeValue());

        NodeList listaRaciocinio = mentais.getElementsByTagName("raciocinio");
        Node raciocinio = listaRaciocinio.item(0).getFirstChild();
        ficha.setRaciocinio(Integer.parseInt(raciocinio.getNodeValue()));
        Element especRaciocinioElement = (Element) listaRaciocinio.item(0);
        Attr especRaciocinio = especRaciocinioElement.getAttributeNode("especialidade");
        ficha.setEspecRaciocinio(especRaciocinio.getNodeValue());

        NodeList listaHabilidades = raiz.getElementsByTagName("habilidades");
        Element habilidades = (Element) listaHabilidades.item(0);

        NodeList listaTalentos = habilidades.getElementsByTagName("talentos");
        Element talentos = (Element) listaTalentos.item(0);

        NodeList listaProntidao = talentos.getElementsByTagName("prontidao");
        Node prontidao = listaProntidao.item(0).getFirstChild();
        ficha.setProntidao(Integer.parseInt(prontidao.getNodeValue()));
        Element especProntidaoElement = (Element) listaProntidao.item(0);
        Attr especProntidao = especProntidaoElement.getAttributeNode("especialidade");
        ficha.setEspecProntidao(especProntidao.getNodeValue());

        NodeList listaEsportes = talentos.getElementsByTagName("esportes");
        Node esportes = listaEsportes.item(0).getFirstChild();
        ficha.setEsportes(Integer.parseInt(esportes.getNodeValue()));
        Element especEsportesElement = (Element) listaEsportes.item(0);
        Attr especEsportes = especEsportesElement.getAttributeNode("especialidade");
        ficha.setEspecEsportes(especEsportes.getNodeValue());

        NodeList listaBriga = talentos.getElementsByTagName("briga");
        Node briga = listaBriga.item(0).getFirstChild();
        ficha.setBriga(Integer.parseInt(briga.getNodeValue()));
        Element especBrigaElement = (Element) listaBriga.item(0);
        Attr especBriga = especBrigaElement.getAttributeNode("especialidade");
        ficha.setEspecBriga(especBriga.getNodeValue());

        NodeList listaEsquiva = talentos.getElementsByTagName("esquiva");
        Node esquiva = listaEsquiva.item(0).getFirstChild();
        ficha.setEsquiva(Integer.parseInt(esquiva.getNodeValue()));
        Element especEsquivaElement = (Element) listaEsquiva.item(0);
        Attr especEsquiva = especEsquivaElement.getAttributeNode("especialidade");
        ficha.setEspecEsquiva(especEsquiva.getNodeValue());

        NodeList listaEmpatia = talentos.getElementsByTagName("empatia");
        Node empatia = listaEmpatia.item(0).getFirstChild();
        ficha.setEmpatia(Integer.parseInt(empatia.getNodeValue()));
        Element especEmpatiaElement = (Element) listaEmpatia.item(0);
        Attr especEmpatia = especEmpatiaElement.getAttributeNode("especialidade");
        ficha.setEspecEmpatia(especEmpatia.getNodeValue());

        NodeList listaExpressao = talentos.getElementsByTagName("expressao");
        Node expressao = listaExpressao.item(0).getFirstChild();
        ficha.setExpressao(Integer.parseInt(expressao.getNodeValue()));
        Element especExpressaoElement = (Element) listaExpressao.item(0);
        Attr especExpressao = especExpressaoElement.getAttributeNode("especialidade");
        ficha.setEspecExpressao(especExpressao.getNodeValue());

        NodeList listaIntimidacao = talentos.getElementsByTagName("intimidacao");
        Node intimidacao = listaIntimidacao.item(0).getFirstChild();
        ficha.setIntimidacao(Integer.parseInt(intimidacao.getNodeValue()));
        Element especIntimidacaoElement = (Element) listaIntimidacao.item(0);
        Attr especIntimidacao = especIntimidacaoElement.getAttributeNode("especialidade");
        ficha.setEspecIntimidacao(especIntimidacao.getNodeValue());

        NodeList listaLideranca = talentos.getElementsByTagName("lideranca");
        Node lideranca = listaLideranca.item(0).getFirstChild();
        ficha.setLideranca(Integer.parseInt(lideranca.getNodeValue()));
        Element especLiderancaElement = (Element) listaLideranca.item(0);
        Attr especLideranca = especLiderancaElement.getAttributeNode("especialidade");
        ficha.setEspecLideranca(especLideranca.getNodeValue());

        NodeList listaManha = talentos.getElementsByTagName("manha");
        Node manha = listaManha.item(0).getFirstChild();
        ficha.setManha(Integer.parseInt(manha.getNodeValue()));
        Element especManhaElement = (Element) listaManha.item(0);
        Attr especManha = especManhaElement.getAttributeNode("especialidade");
        ficha.setEspecManha(especManha.getNodeValue());

        NodeList listaLabia = talentos.getElementsByTagName("labia");
        Node labia = listaLabia.item(0).getFirstChild();
        ficha.setLabia(Integer.parseInt(labia.getNodeValue()));
        Element especLabiaElement = (Element) listaLabia.item(0);
        Attr especLabia = especLabiaElement.getAttributeNode("especialidade");
        ficha.setEspecLabia(especLabia.getNodeValue());

        NodeList listaPericias = habilidades.getElementsByTagName("pericias");
        Element pericias = (Element) listaPericias.item(0);

        NodeList listaEmpatiaAnimais = pericias.getElementsByTagName("empatiaAnimais");
        Node empatiaAnimais = listaEmpatiaAnimais.item(0).getFirstChild();
        ficha.setEmpatiaAnimais(Integer.parseInt(empatiaAnimais.getNodeValue()));
        Element especEmpatiaAnimaisElement = (Element) listaEmpatiaAnimais.item(0);
        Attr especEmpatiaAnimais = especEmpatiaAnimaisElement.getAttributeNode("especialidade");
        ficha.setEspecEmpatiaAnimais(especEmpatiaAnimais.getNodeValue());

        NodeList listaOficios = pericias.getElementsByTagName("oficios");
        Node oficios = listaOficios.item(0).getFirstChild();
        ficha.setOficios(Integer.parseInt(oficios.getNodeValue()));
        Element especOficiosElement = (Element) listaOficios.item(0);
        Attr especOficios = especOficiosElement.getAttributeNode("especialidade");
        ficha.setEspecOficios(especOficios.getNodeValue());

        NodeList listaConducao = pericias.getElementsByTagName("conducao");
        Node conducao = listaConducao.item(0).getFirstChild();
        ficha.setConducao(Integer.parseInt(conducao.getNodeValue()));
        Element especConducaoElement = (Element) listaConducao.item(0);
        Attr especConducao = especConducaoElement.getAttributeNode("especialidade");
        ficha.setEspecConducao(especConducao.getNodeValue());

        NodeList listaEtiqueta = pericias.getElementsByTagName("etiqueta");
        Node etiqueta = listaEtiqueta.item(0).getFirstChild();
        ficha.setEtiqueta(Integer.parseInt(etiqueta.getNodeValue()));
        Element especEtiquetaElement = (Element) listaEtiqueta.item(0);
        Attr especEtiqueta = especEtiquetaElement.getAttributeNode("especialidade");
        ficha.setEspecEtiqueta(especEtiqueta.getNodeValue());

        NodeList listaArmasFogo = pericias.getElementsByTagName("armasFogo");
        Node armasFogo = listaArmasFogo.item(0).getFirstChild();
        ficha.setArmasFogo(Integer.parseInt(armasFogo.getNodeValue()));
        Element especArmasFogoElement = (Element) listaArmasFogo.item(0);
        Attr especArmasFogo = especArmasFogoElement.getAttributeNode("especialidade");
        ficha.setEspecArmasFogo(especArmasFogo.getNodeValue());

        NodeList listaArmasBrancas = pericias.getElementsByTagName("armasBrancas");
        Node armasBrancas = listaArmasBrancas.item(0).getFirstChild();
        ficha.setArmasBrancas(Integer.parseInt(armasBrancas.getNodeValue()));
        Element especArmasBrancasElement = (Element) listaArmasBrancas.item(0);
        Attr especArmasBrancas = especArmasBrancasElement.getAttributeNode("especialidade");
        ficha.setEspecArmasBrancas(especArmasBrancas.getNodeValue());

        NodeList listaPerformance = pericias.getElementsByTagName("performance");
        Node performance = listaPerformance.item(0).getFirstChild();
        ficha.setPerformance(Integer.parseInt(performance.getNodeValue()));
        Element especPerformanceElement = (Element) listaPerformance.item(0);
        Attr especPerformance = especPerformanceElement.getAttributeNode("especialidade");
        ficha.setEspecPerformance(especPerformance.getNodeValue());

        NodeList listaSeguranca = pericias.getElementsByTagName("seguranca");
        Node seguranca = listaSeguranca.item(0).getFirstChild();
        ficha.setSegurnaca(Integer.parseInt(seguranca.getNodeValue()));
        Element especSegurancaElement = (Element) listaSeguranca.item(0);
        Attr especSeguranca = especSegurancaElement.getAttributeNode("especialidade");
        ficha.setEspecSeguranca(especSeguranca.getNodeValue());

        NodeList listaFurtividade = pericias.getElementsByTagName("furtividade");
        Node furtividade = listaFurtividade.item(0).getFirstChild();
        ficha.setFurtividade(Integer.parseInt(furtividade.getNodeValue()));
        Element especFurtividadeElement = (Element) listaFurtividade.item(0);
        Attr especFurtividade = especFurtividadeElement.getAttributeNode("especialidade");
        ficha.setEspecFurtividade(especFurtividade.getNodeValue());

        NodeList listaSobrevivencia = pericias.getElementsByTagName("sobrevivencia");
        Node sobrevivencia = listaSobrevivencia.item(0).getFirstChild();
        ficha.setSobrevivencia(Integer.parseInt(sobrevivencia.getNodeValue()));
        Element especSobrevivenciaElement = (Element) listaSobrevivencia.item(0);
        Attr especSobrevivencia = especSobrevivenciaElement.getAttributeNode("especialidade");
        ficha.setEspecSobrevivencia(especSobrevivencia.getNodeValue());

        NodeList listaConhecimentos = habilidades.getElementsByTagName("conhecimentos");
        Element conhecimentos = (Element) listaConhecimentos.item(0);

        NodeList listaAcademicos = conhecimentos.getElementsByTagName("academicos");
        Node academicos = listaAcademicos.item(0).getFirstChild();
        ficha.setAcademico(Integer.parseInt(academicos.getNodeValue()));
        Element especAcademicosElement = (Element) listaAcademicos.item(0);
        Attr especAcademicos = especAcademicosElement.getAttributeNode("especialidade");
        ficha.setEspecAcademico(especAcademicos.getNodeValue());


        NodeList listaComputador = conhecimentos.getElementsByTagName("computador");
        Node computador = listaComputador.item(0).getFirstChild();
        ficha.setComputador(Integer.parseInt(computador.getNodeValue()));
        Element especComputadorElement = (Element) listaComputador.item(0);
        Attr especComputador = especComputadorElement.getAttributeNode("especialidade");
        ficha.setEspecComputador(especComputador.getNodeValue());

        NodeList listaFinancas = conhecimentos.getElementsByTagName("financas");
        Node financas = listaFinancas.item(0).getFirstChild();
        ficha.setFinancas(Integer.parseInt(financas.getNodeValue()));
        Element especFinancasElement = (Element) listaFinancas.item(0);
        Attr especFinancas = especFinancasElement.getAttributeNode("especialidade");
        ficha.setEspecFinancas(especFinancas.getNodeValue());

        NodeList listaInvestigacao = conhecimentos.getElementsByTagName("investigacao");
        Node investigacao = listaInvestigacao.item(0).getFirstChild();
        ficha.setInvestigacao(Integer.parseInt(investigacao.getNodeValue()));
        Element especInvestigacaoElement = (Element) listaInvestigacao.item(0);
        Attr especInvestigacao = especInvestigacaoElement.getAttributeNode("especialidade");
        ficha.setEspecInvestigacao(especInvestigacao.getNodeValue());

        NodeList listaDireito = conhecimentos.getElementsByTagName("direito");
        Node direito = listaDireito.item(0).getFirstChild();
        ficha.setDireito(Integer.parseInt(direito.getNodeValue()));
        Element especDireitoElement = (Element) listaDireito.item(0);
        Attr especDireito = especDireitoElement.getAttributeNode("especialidade");
        ficha.setEspecDireito(especDireito.getNodeValue());

        NodeList listaLinguistica = conhecimentos.getElementsByTagName("linguistica");
        Node linguistica = listaLinguistica.item(0).getFirstChild();
        ficha.setLinguistica(Integer.parseInt(linguistica.getNodeValue()));
        Element especLinguisticaElement = (Element) listaLinguistica.item(0);
        Attr especLinguistica = especLinguisticaElement.getAttributeNode("especialidade");
        ficha.setEspecLinguistica(especLinguistica.getNodeValue());

        NodeList listaMedicina = conhecimentos.getElementsByTagName("medicina");
        Node medicina = listaMedicina.item(0).getFirstChild();
        ficha.setMedicina(Integer.parseInt(medicina.getNodeValue()));
        Element especMedicinaElement = (Element) listaMedicina.item(0);
        Attr especMedicina = especMedicinaElement.getAttributeNode("especialidade");
        ficha.setEspecMedicina(especMedicina.getNodeValue());

        NodeList listaOcultismo = conhecimentos.getElementsByTagName("ocultismo");
        Node ocultismo = listaOcultismo.item(0).getFirstChild();
        ficha.setOcultismo(Integer.parseInt(ocultismo.getNodeValue()));
        Element especOcultismoElement = (Element) listaOcultismo.item(0);
        Attr especOcultismo = especOcultismoElement.getAttributeNode("especialidade");
        ficha.setEspecOcultismo(especOcultismo.getNodeValue());

        NodeList listaPolitica = conhecimentos.getElementsByTagName("politica");
        Node politica = listaPolitica.item(0).getFirstChild();
        ficha.setPolitica(Integer.parseInt(politica.getNodeValue()));
        Element especLabiaPolitica = (Element) listaPolitica.item(0);
        Attr especPolitica = especLabiaPolitica.getAttributeNode("especialidade");
        ficha.setEspecPolitica(especPolitica.getNodeValue());

        NodeList listaCiencia = conhecimentos.getElementsByTagName("ciencia");
        Node ciencia = listaCiencia.item(0).getFirstChild();
        ficha.setCiencia(Integer.parseInt(ciencia.getNodeValue()));
        Element especCienciaElement = (Element) listaCiencia.item(0);
        Attr especCiencia = especCienciaElement.getAttributeNode("especialidade");
        ficha.setEspecCiencia(especCiencia.getNodeValue());

        NodeList listaVantagens = raiz.getElementsByTagName("vantagens");
        Element vantagens = (Element) listaVantagens.item(0);

        NodeList listaAntecedentes = vantagens.getElementsByTagName("antecedentes");
        Element antecedentes = (Element) listaAntecedentes.item(0);
        NodeList listaAntecedente = antecedentes.getElementsByTagName("antecedente");

        List<Skill> antecedente = new ArrayList<Skill>();

        for (int i = 0; i < listaAntecedente.getLength(); i++) {

            Node antecedenteNode = listaAntecedente.item(i).getFirstChild();

            Skill antecedenteClass = new Skill();
            antecedenteClass.setNivel(Integer.parseInt(antecedenteNode.getNodeValue()));

            Element antecedenteElement = (Element) listaAntecedente.item(i);
            Attr nomeAntecedente = antecedenteElement.getAttributeNode("nome");
            antecedenteClass.setNome(nomeAntecedente.getNodeValue());

            antecedente.add(antecedenteClass);
        }
        ficha.setAntecedentes(antecedente);

        NodeList listaDisciplinas = vantagens.getElementsByTagName("disciplinas");
        Element disciplinas = (Element) listaDisciplinas.item(0);
        NodeList listaDisciplina = disciplinas.getElementsByTagName("disciplina");

        List<Skill> disciplina = new ArrayList<Skill>();

        for (int i = 0; i < listaDisciplina.getLength(); i++) {
            Node discplinaNode = listaDisciplina.item(i).getFirstChild();

            Skill disciplinaClass = new Skill();
            disciplinaClass.setNivel(Integer.parseInt(discplinaNode.getNodeValue()));

            Element disciplinaElement = (Element) listaDisciplina.item(i);
            Attr nomeDisciplina = disciplinaElement.getAttributeNode("nome");
            disciplinaClass.setNome(nomeDisciplina.getNodeValue());
            disciplina.add(disciplinaClass);
        }
        ficha.setDisciplinas(disciplina);

        NodeList listaVirtudes = vantagens.getElementsByTagName("virtudes");
        Element virtudes = (Element) listaVirtudes.item(0);

        NodeList listaConscienciaConviccao = virtudes.getElementsByTagName("conscienciaConviccao");
        Node conscienciaConviccao = listaConscienciaConviccao.item(0).getFirstChild();
        ficha.setConsciencia(Integer.parseInt(conscienciaConviccao.getNodeValue()));

        NodeList listaAutocontroleInstintos = virtudes.getElementsByTagName("autocontroleInstintos");
        Node autocontroleInstintos = listaAutocontroleInstintos.item(0).getFirstChild();
        ficha.setAutocontrole(Integer.parseInt(autocontroleInstintos.getNodeValue()));

        NodeList listaCoragem = virtudes.getElementsByTagName("coragem");
        Node coragem = listaCoragem.item(0).getFirstChild();
        ficha.setCoragem(Integer.parseInt(coragem.getNodeValue()));

        NodeList listaQualidadesDefeitos = raiz.getElementsByTagName("qualidadesDefeitos");
        Element qualidadesDefeitos = (Element) listaQualidadesDefeitos.item(0);

        NodeList listaQualidadeDefeito = qualidadesDefeitos.getElementsByTagName("qualidadeDefeito");
        List<Skill> qualidadeDefeito = new ArrayList<Skill>();

        for (int i = 0; i < listaQualidadeDefeito.getLength(); i++) {
            Skill qualidadeClass = new Skill();
            Node qualidadeDefeitoNode = listaQualidadeDefeito.item(i).getFirstChild();
            qualidadeClass.setNivel(Integer.parseInt(qualidadeDefeitoNode.getNodeValue()));

            Element qualidadeDefeitoElement = (Element) listaQualidadeDefeito.item(i);
            Attr nomeQualidade = qualidadeDefeitoElement.getAttributeNode("nome");
            qualidadeClass.setNome(nomeQualidade.getNodeValue());

            qualidadeDefeito.add(qualidadeClass);
        }
        ficha.setQualidadesDefeitos(qualidadeDefeito);

        NodeList listaHumanidade = raiz.getElementsByTagName("humanidade");
        Node humanidade = listaHumanidade.item(0).getFirstChild();
        ficha.setHumanidade(Integer.parseInt(humanidade.getNodeValue()));
        Element trilhaElement = (Element) listaHumanidade.item(0);
        Attr trilha = trilhaElement.getAttributeNode("trilha");
        ficha.setTrilha(trilha.getNodeValue());

        NodeList listaForcaVontade = raiz.getElementsByTagName("forcaVontade");
        Node forcaVontade = listaForcaVontade.item(0).getFirstChild();
        ficha.setForcaDeVontade(Integer.parseInt(forcaVontade.getNodeValue()));
        
        return ficha;
    }
}

/*
 * estrutura esperada do XML:
 * 
 */
